package com.cskaoyan.demo11.mapper;

import com.cskaoyan.demo11.model.MarketOrder;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface MarketOrderMapper {
    /**
     * where标签：1.给标签中的内容前面增加上WHERE关键字
     *           2.如果标签里的内容 最前面 有and或or的话可以帮我们自动省略掉
     *           <where>
     *              and id = #{id}
     *           </where>
     *           3. 如果标签里没有内容，则不会拼接WHERE
     * 下面这两个特点是实现条件查询非常重要的基础，防止SQL语法(Syntax)错误
     */
    MarketOrder selectByPrimaryKey(Integer id);

    List<MarketOrder> selectByOrderStatus(Short orderStatus);

    /**
     * 条件查询
     * userId = null, orderSn = null, orderStatus = null             → 查询所有 不添加查询条件
     * <include refid = "MarketOrderSelect"/>
     * userId = 1, orderSn = null, orderStatus = null                → 查询userId=1的所有订单
     * <include refid = "MarketOrderSelect"/> where userId = ?
     * userId = null, orderSn = "20220715439304", orderStatus = null → 查询orderSn="20220715439304"的所有订单
     * <include refid = "MarketOrderSelect"/> where orderSn = ?
     * userId = null, orderSn = null, orderStatus = 401              → 查询orderStatus=401的所有订单
     * <include refid = "MarketOrderSelect"/> where orderStatus = ?
     * userId = 1, orderSn = "20220715439304", orderStatus = 401     → 查询userId=1, orderSn="20220715439304", orderStatus=401的订单
     * <include refid = "MarketOrderSelect"/> where userId = ? and orderSn = ? and orderStatus = ?
     * userId = 1, orderSn = null ,orderStatus = 401                 → 查询userId=1, orderStatus=401的订单
     * <include refid = "MarketOrderSelect"/> where userId = ? and orderStatus = ?
     * userId = null, orderSn = "20220715439304", orderStatus = 401  → 查询orderSn="20220715439304", orderStatus=401的订单
     * <include refid = "MarketOrderSelect"/> where orderSn = ? and orderStatus = ?
     * 传入这里的值不为空的情况下拼接条件
     */
    List<MarketOrder> selectByConditions(@Param("userId") Integer userId,
                                         @Param("orderSn") String orderSn,
                                         @Param("orderStatus") Short orderStatus);

    // 更新订单数据 → 更新其中的所有的值
    int updateByPrimaryKey(MarketOrder marketOrder);

    // 选择性更新 ：选择不是哪些记录，而是哪些字段做更新
    /**
     * trim标签
     *   拼接功能：prefix、suffix
     *   省略功能：prefixOverrides、suffixOverrides
     * 条件更新：省略掉最后的逗号 suffixOverrides
     */
    int updateSelectiveByPrimaryKey(MarketOrder marketOrder);
    /**
     * set标签:和下面这个trim标签的功能是一样的
     * <trim prefix="SET" suffixOverrides=","></trim>
     */
    int updateSelectiveByPrimaryKey2(MarketOrder marketOrder);

    // selectKey标签：在插入数据的时候，获取自增主键的值
    // marketOrder的参数插入的时候作为参数，插入完成之后通过selectKey执行了查询获得了自增的主键→ 封装给了marketOrder的id这个成员变量
    int insertSelective(MarketOrder marketOrder);
    // useGeneratedKeys和keyProperty两个属性来获得自增的主键
    int insertSelective2(MarketOrder marketOrder);

    /**
     * foreach标签来做遍历 → foreach标签中的内容做遍历
     * select * from market_order where order_status in (?, ?, ?)
     * 数组的长度为多少，就遍历多少次
     * ?占位符出现的次数和数组的长度(集合的大小)是一样的
     * open、close：类似与trim的prefix和suffix，在foreach标签最左侧和最右侧拼接一次内容
     * separator：分隔符，每两个遍历的内容之间增加的 分隔符
     * item: foreach标签里 对单个遍历的元素的使用的名称 → #{}写什么
     * collection: 遍历的集合 → 和你传入的参数类型和写法有关系
     *                无注解：数组array 集合list\collection
     *                @Param注解：@Param的value属性写了什么，就使用什么
     * 做好分析：哪些内容出现的次数和遍历次数相同，哪些内容是每两个遍历内容之间的，哪些内容值出现了一次
     *
     * in (?,?,?)
     * <foreach open="(" close=")" separator="," item="abc">
     *     #{abc}
     * </foreach>
     *
     */
    List<MarketOrder> selectOrderStatusInArray(Short[] orderStatusArray);

    // 传入的参数是List → collection属性：list
    List<MarketOrder> selectOrderStatusInCollection(List<Short> orderStatusList);
    // 传入的参数不管你是数组还是集合类对象，使用@Param注解： collection属性：orderStatusList
    List<MarketOrder> selectOrderStatusInCollectionParam(@Param("orderStatusList") List<Short> orderStatusList);

    // insert into market_order (....) values (?,?,?,?), (?,?,?,?), (?,?,?,?)
    int insertList(@Param("orders") List<MarketOrder> list);
}
